// stock.ts
// 导入IndexedDB服务
import { getAllStocks, batchUpdateStocks, type StockItem } from '@/data/InvestmentDB'
import { queryStockDetailsApi } from '@/api/modules/Rich'
let stockData: StockItem[] = []

// 刷新表格数据
export const refreshStockData = async () => {
  try {
    const data = await getAllStocks()
    stockData = data.map((item) => {
      item.fullCode = getStockPrefix(item.code) + item.code
      return item
    })
    await fetchStockData() // 等待数据更新完成后再继续
  } catch (error) {
    console.error('刷新股票数据失败:', error)
  } finally {
    // loading.close()
  }
}

// 获取股票前缀（保持不变）
const getStockPrefix = (code: string): string => {
  // 验证输入有效性
  if (!code || typeof code !== 'string' || !/^\d{5,6}$/.test(code)) {
    console.warn(`无效的股票代码: ${code}，应为5位或6位数字字符串`)
    return ''
  }

  // 获取不同长度的前缀
  const prefix3 = code.substring(0, 3)
  const prefix4 = code.substring(0, 4)
  const codeLength = code.length

  // 上海市场
  if (codeLength === 6) {
    // 上海主板
    if (['600', '601', '603', '605'].includes(prefix3)) {
      return 'sh'
    }

    // 上海市场ETF（包括512开头的行业ETF等）
    if (['510', '512', '513', '515', '588'].includes(prefix3)) {
      return 'sh'
    }
    // 上海市场特殊基金（包括508开头的科创板相关产品等）
    if (['508', '510', '512', '513', '515', '588'].includes(prefix3)) {
      return 'sh'
    }
    // 上海科创板
    if (prefix3 === '688') {
      return 'sh'
    }
  }

  // 深圳市场
  if (codeLength === 6) {
    // 深圳主板
    if (prefix3 === '000' || prefix3 === '001') {
      return 'sz'
    }
    // 深圳中小板
    if (prefix3 === '002') {
      return 'sz'
    }
    // 深圳创业板
    if (['300', '301'].includes(prefix3)) {
      return 'sz'
    }
  }

  // 北交所（原新三板精选层）
  if (codeLength === 6 && prefix3 === '889') {
    return 'bj'
  }

  // 港股通（沪市）
  if (codeLength === 5) {
    return 'hk'
  }

  // 国债逆回购
  if (codeLength === 6) {
    // 上海国债逆回购
    if (prefix4 >= '204001' && prefix4 <= '204888') {
      return 'sh'
    }
    // 深圳国债逆回购
    if (prefix4 >= '131800' && prefix4 <= '131810') {
      return 'sz'
    }
  }

  // 无法识别的代码
  console.warn(`无法识别的股票代码: ${code}`)
  return ''
}

// 获取股票数据（修改部分：添加批量更新逻辑）
const fetchStockData = async () => {
  // 提取常量定义，提高可维护性
  const STOCK_FIELDS =
    'f59,f43,f57,f58,f169,f170,f46,f44,f51,f168,f47,f164,f163,f116,f60,f45,f52,f50,f48,f167,f117,f71,f161,f49,f530,f135,f136,f137,f138,f139,f141,f142,f144,f145,f147,f148,f140,f143,f146,f149,f55,f62,f162,f92,f173,f104,f105,f84,f85,f183,f184,f185,f186,f187,f188,f189,f190,f191,f192,f107,f111,f86,f177,f78,f110,f262,f263,f264,f267,f268,f250,f251,f252,f253,f254,f255,f256,f257,f258,f266,f269,f270,f271,f273,f274,f275,f127,f199,f128,f193,f196,f194,f195,f197,f80,f280,f281,f282,f284,f285,f286,f287,f292'

  // 提前检查表格数据是否为空，避免无效请求
  if (stockData.length === 0) {
    console.log('无股票数据可更新')
    return []
  }

  try {
    // 使用Promise.allSettled替代Promise.all，确保单个请求失败不影响整体
    const results = await Promise.allSettled(
      stockData.map(async (item) => {
        const code = item.fullCode
        // 跳过无效代码
        if (!code) {
          console.warn('无效的股票代码，跳过更新', item)
          return null
        }

        try {
          // 提取股票代码转换逻辑为独立函数，提高可读性
          const secid = convertCodeToSecId(code)
          const { data } = await queryStockDetailsApi({ secid, fields: STOCK_FIELDS })

          // 提取数据处理逻辑为独立函数
          updateStockItemData(item, data, code)
          return { code, status: 'success', item } // 这里返回处理后的item
        } catch (error) {
          console.error(`获取股票 ${code} 数据失败:`, error)
          // 失败时仍返回状态，便于后续统计
          return { code, status: 'error', error }
        }
      }),
    )

    // 筛选出成功更新的股票数据
    const updatedStocks = results
      .filter((r) => r.status === 'fulfilled' && r.value?.status === 'success' && r.value.item)
      .map((r) => (r as PromiseFulfilledResult<{ item: StockItem }>).value.item)

    // 执行批量更新
    if (updatedStocks.length > 0) {
      await batchUpdateStocks(updatedStocks)
      console.log(`已成功批量更新 ${updatedStocks.length} 条股票数据到本地数据库`)
    }

    // 统计成功/失败数量，方便调试和用户反馈
    const successCount = updatedStocks.length
    const totalCount = stockData.length
    console.log(`股票数据更新完成: 成功 ${successCount}/${totalCount}`)

    // 当失败数量较多时给出提示
    if (totalCount - successCount > 0) {
      console.error(`部分股票数据更新失败 (${totalCount - successCount}/${totalCount})`)
    }

    return results
  } catch (error) {
    console.error('股票数据更新整体失败:', error)
    // ElMessage.error('获取股票数据失败，请稍后重试')
    return []
  }
}

// 辅助函数：将股票代码转换为东方财富secid格式（保持不变）
const convertCodeToSecId = (code: string): string => {
  if (code.length === 8) {
    return code.startsWith('sh') ? `1.${code.slice(2)}` : `0.${code.slice(2)}`
  }
  return `0.${code}`
}

// 辅助函数：更新股票项目数据（保持不变）
const updateStockItemData = (item: StockItem, data: any, code: string) => {
  // 基础数据处理
  item.name = data.f58 || item.name // 保留原有名称以防接口返回空

  // 价格处理（根据类型区分精度）
  // 股票类型(stock)使用100作为分母，其余类型(fund/convertible)使用1000
  const isStockType = item.type === 'stock'
  item.price = isStockType ? data.f43 / 100 : data.f43 / 1000
  item.preClose = isStockType ? data.f60 / 100 : data.f60 / 1000

  // 计算涨跌幅（处理昨收价为0的边界情况）
  if (item.preClose && item.preClose > 0) {
    item.change = (((item.price - item.preClose) / item.preClose) * 100).toFixed(2)
  } else {
    item.change = '0.00'
    console.warn(`股票 ${code} 昨收价异常，涨跌幅计算失败`)
  }

  // 提取基础计算参数并做类型转换
  const cost = Number(item.cost) || 0

  // 记录最后更新时间
  item.lastUpdated = new Date().toISOString()
  const holdings = Number(item.holdings) || 0
  const tax = Number(item.tax) || 0
  const currentPrice = item.price || 0

  // 计算投入金额：成本价×持仓数量 + 税费
  if (holdings > 0 && cost > 0) {
    const investment = cost * holdings
    item.investment = investment
  } else {
    item.investment = '0.00'
    if (import.meta.env.DEV) {
      console.debug(`股票 ${code} 缺少成本或持仓数据，投入金额计算为0`)
    }
  }

  // 计算持仓金额：当前价格×持仓数量
  if (holdings > 0 && currentPrice > 0) {
    const holdingValue = currentPrice * holdings
    item.holdingValue = holdingValue
  } else {
    item.holdingValue = '0.00'
    if (import.meta.env.DEV) {
      console.debug(`股票 ${code} 缺少持仓或当前价格数据，持仓金额计算为0`)
    }
  }

  // 计算总盈亏
  if (holdings > 0 && cost > 0) {
    const profit = (currentPrice - cost) * holdings - tax
    item.profit = profit

    // 计算持仓盈亏率
    const investment = Number(item.investment) || 0
    if (investment > 0) {
      item.profitRate = ((profit / investment) * 100).toFixed(2)
    } else {
      item.profitRate = '0.00'
    }
  } else {
    item.profit = '0.00'
    item.profitRate = '0.00'
    if (import.meta.env.DEV) {
      console.debug(`股票 ${code} 缺少成本或持仓数据，总盈亏计算为0`)
    }
  }

  // 计算今日盈亏：(最新价 - 昨收价) * 持仓数量 - 税费
  if (holdings > 0 && item.preClose && item.preClose > 0) {
    const todayProfit = (currentPrice - item.preClose) * holdings - tax
    item.todayProfit = todayProfit
  } else {
    item.todayProfit = '0.00'
    if (import.meta.env.DEV) {
      console.debug(`股票 ${code} 缺少持仓或昨收数据，今日盈亏计算为0`)
    }
  }
}
